package jianger.v2;

import jianger.utils.GetDocumentUtils;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import redis.clients.jedis.Jedis;

import java.io.IOException;
import java.util.HashSet;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author jianger
 * @date 2018/2/27
 * <p>
 * Master主要是对于页面的解析，获取pid，存在redis中
 * 用到的技术点：
 * 1. 分布式爬虫，mater用于解析页面获取pid，slave用于读取pid，解析页面信息
 * 2. redis存储pid，用于缓存pid。matser存pid，slave取pid
 * 3. 使用ip池动态代理针对反爬虫
 * 4. 多线程
 */
public class Master {

    //    private static GenericObjectPoolConfig poolConfig
//    private static JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);
    // 向JedisPool借用8次连接，但是没有执行归还操作。
    private static Jedis jedis = new Jedis("127.0.0.1", 6379);

    private static ExecutorService pool = Executors.newFixedThreadPool(20);

    public static void main(String[] args) throws Exception {

        //解析首页
        indexPhone();
        //2. 翻页
        doPaging();
    }

    //解析首页
    private static void indexPhone() throws Exception {
        // 1. 解析首页，传入关键字手机
        String keyWorld = "手机";
        String indexUrl = "https://search.jd.com/Search?keyword=" + keyWorld
                + "&enc=utf-8&pvid=9f8a79872dc644699e6a62597d745ce4";
        Document document = GetDocumentUtils.getDecument(indexUrl); // 获取手机首页的document
        getPid(document);
    }

    private static void doPaging() throws IOException {
        // 第二部分：解析搜索结果的翻页数据
        // 分页请求
        // 分页接口：https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&
        // enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=3&s=60&click=0
        // 能够变化两个字：page，s 。s推测是时间戳，并 且测试之后可以删除掉。
        // page 的值 page=2n-1 n是第几页
        // 总共分100页
        int totalPage = 100;
        int page = 0;
        // 从第二页开始执行分页
        for (int i = 2; i <= totalPage; i++) {
            page = i * 2 - 1;
            String pagingUrl = "https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=" +
                    "utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=" + page + "&click=0";
            //发送请求
            final Document document = GetDocumentUtils.getDecument(pagingUrl);


            getPid(document);


        }

    }


    //解析页面，获取pid，存到redis中
    private static void getPid(Document document) {
        while (true) {
            Elements elements = document.select("[data-pid]");
            HashSet<String> pids = new HashSet<String>();
            if (elements.size() != 0) {
                for (Element element : elements) {
                    String pid = element.attr("data-pid"); // 获取每个手机的pid
                    pids.add(pid);
                }
            }
            for (final String pid : pids) {
                System.out.println(pid);
                jedis.lpush("pid", pid);
            }


        }

    }
}

